home *** CD-ROM | disk | FTP | other *** search
/ Resource Library: Multimedia / Resource Library: Multimedia.iso / hypercrd / xcmds / dvlprstc.hqx / Developer Stack 1.3r / card_8432.txt < prev    next >
Text File  |  1991-04-30  |  8KB  |  238 lines

  1. -- card: 8432 from stack: in.3r
  2. -- bmap block id: 0
  3. -- flags: 0000
  4. -- background id: 14090
  5. -- name: Text Import
  6.  
  7.  
  8. -- part 1 (button)
  9. -- low flags: 00
  10. -- high flags: A004
  11. -- rect: left=194 top=253 right=284 bottom=352
  12. -- title width / last selected line: 0
  13. -- icon id / first selected line: 0 / 0
  14. -- text alignment: 1
  15. -- font id: 0
  16. -- text size: 12
  17. -- style flags: 0
  18. -- line height: 16
  19. -- part name: Import Text Button
  20. ----- HyperTalk script -----
  21. --File Importer Button 1.1
  22. --Copyright ┬⌐ 1987 Stephen Michel 1027 Pomona, Albany, CA 94706
  23. --9-3-87
  24. --More notes at the end of the script
  25.  
  26. on mouseUp
  27.   if the optionkey is down then pass mouseup
  28.   global inFile
  29.   global error
  30.   newStack
  31.   show message box at 33,296
  32.   getFile
  33.   if error is not empty then
  34.     answer "Import Stopped!" with "Okay"
  35.     exit mouseUp
  36.   end if
  37.   goodFile
  38.   if error is not empty then
  39.     exit mouseUp
  40.   end if
  41.   createStruct
  42.   importText
  43.   choose browse tool
  44. end mouseUp
  45.  
  46. on newStack
  47.   global inFile
  48.   global error
  49.   -- Creates the new stack
  50.   doMenu New Stack...
  51. end newStack
  52.  
  53. on getFile
  54.   global inFile
  55.   global error
  56.   -- finds the file to import from
  57.   put FileName("TEXT") into it
  58.   if it is empty then
  59.     put "true" into error
  60.   else
  61.     put empty into error
  62.     put it into inFile
  63.   end if
  64. end getFile
  65.  
  66. on createStruct
  67.   -- right now, this just creates a structure for a tab-delimited file
  68.   global inFile
  69.   global error
  70.   global countFields
  71.   put 0 into countFields
  72.   open file inFile
  73.   put "Now analyzing the structure & counting fields..."
  74.   put "dummy" into it
  75.   -- simply loops through the first record until it hits a return
  76.   -- and adds one to countFields every time it finds a tab
  77.   repeat until it is empty
  78.     read from file inFile until tab
  79.     add 1 to countFields
  80.     if it contains return then
  81.       exit repeat
  82.     end if
  83.   end repeat
  84.   close file inFile
  85.   put "There are " & countFields & " fields in the file"
  86.   domenu "background"
  87.   open file inFile
  88.   -- now we are creating the strucutre, naming the fields, placing them
  89.   -- show the data in the first record as the field name (in case the
  90.   -- field names in the first record & to help in remembering the data
  91.   -- to assign names to the fields)
  92.   repeat with x = 1 to countFields - 1
  93.     read from file inFile until tab
  94.     delete last character of it
  95.     ask "Please type a name for field" && x with it
  96.     put it into fieldName
  97.     newField fieldName
  98.   end repeat
  99.   -- this does the same for the last field
  100.   read from file inFile until return
  101.   ask "Please type a name for field" && countFields with it
  102.   put it into fieldName
  103.   newfield fieldName
  104.   -- all done!
  105.   domenu "background"
  106.   close file inFile
  107. end createStruct
  108.  
  109. on importText
  110.   global inFile
  111.   global error
  112.   global countFields
  113.   open file inFile
  114.   put "dummy" into it
  115.   put 1 into recNum
  116.   -- loops through the cards & fields until the end of file
  117.   -- this usually creates one or two extra cards, but it
  118.   -- was easy to code.
  119.   put the seconds into startTime
  120.   repeat until it is empty
  121.     put "Now on record #" & recNum
  122.     repeat with x = 1 to countFields -1
  123.       read from file inFile until tab
  124.       -- this line removes the tab
  125.       delete last character of it
  126.       repeat while it contains quote
  127.         delete char offset(quote,it) of it
  128.       end repeat
  129.       put it into field x
  130.     end repeat
  131.     -- now do the same for the last field
  132.     read from file inFile until return
  133.     put it into field countFields
  134.     domenu "new card"
  135.     add 1 to recNum
  136.   end repeat
  137.   -- all done!
  138.   put the seconds into stopTime
  139.   close file inFile
  140.   put stopTime - startTime into timeTook
  141.   divide timeTook by 60
  142.   hide message window
  143.   answer "Done!" && recNum && "records written" with "Ok"
  144. end importText
  145.  
  146. on goodFile
  147.   -- checks to make sure the file exists
  148.   -- Hypercard automatically creates a new file when you
  149.   -- issue the "open" command.  So we read from the file
  150.   -- to see if there is anything in it.
  151.   -- Be sure to delete any excess files created by this.
  152.   -- You can probably type in a path name to a file, if it is not
  153.   -- in the same folder as HyperCard
  154.   global inFile
  155.   global error
  156.   open file inFile
  157.   read from file inFile until return
  158.   if it is empty then
  159.     put "That file does not exist"
  160.     put "true" into error
  161.     close file inFile
  162.     exit goodFile
  163.   end if
  164.   close file inFile
  165. end goodFile
  166.  
  167. on newField fieldName
  168.   -- this routine simply creates the field
  169.   -- this lets us add to a background that already contains fields
  170.   put the number of background fields into numFields
  171.   put numFields + 1 into thisField
  172.   put "click where you want the field to go"
  173.   wait until the mouseClick
  174.   put the mouseLoc into here
  175.   domenu "new field"
  176.   put first item of here into right
  177.   -- fixed current length of field on screen
  178.   add 150 to right
  179.   put second item of here into bottom
  180.   add 20 to bottom
  181.   put here && ","&& right && "," && bottom into thePlace
  182.   -- these can be changed for different field defaults
  183.   set rect of background field thisField to thePlace
  184.   set style of background field thisField to rectangle
  185.   set name of background field thisField to fieldName
  186. end newField
  187.  
  188. -- This button is self-contained.  That means you can place the button
  189. -- in any background you like & use it to create a stack. It will first
  190. -- create a new stack (with the usual HyperCard "New Stack" dialogue).
  191.  
  192.  
  193.  
  194.  
  195.  
  196. -- part 9 (field)
  197. -- low flags: 00
  198. -- high flags: 0007
  199. -- rect: left=58 top=45 right=251 bottom=509
  200. -- title width / last selected line: 0
  201. -- icon id / first selected line: 0 / 0
  202. -- text alignment: 0
  203. -- font id: 3
  204. -- text size: 9
  205. -- style flags: 0
  206. -- line height: 12
  207. -- part name: 
  208.  
  209.  
  210. -- part contents for background part 5
  211. ----- text -----
  212. 4
  213.  
  214. -- part contents for background part 12
  215. ----- text -----
  216. Text Import
  217.  
  218. -- part contents for card part 9
  219. ----- text -----
  220. IMPORTER 1.1                                     
  221. Copyright ┬⌐ 1987 Stephen Michel
  222. 1027 Pomona, Albany, CA 94706  CompuServe: 70611,1215
  223. If you like it, please send $10.  Thanx.
  224.  
  225. ABOUT THIS BUTTON: It will read any TAB DELIMITED file into a new stack, allow you to name fields to hold the data, and do some crude layout of the form.  It will provide a relatively complete HyperCard database that includes next, previous, and home buttons -- the rest is up to you.  
  226.  
  227. You will be asked first for the name of the new stack.  Next it will want to know what text file file to import - just select it.   The script will then read the file, figure out how many fields are in it and ask for the name of each field.  Each field name defaults to the data that is in that field in the first record of the file -- to help you remember what each field is, or if you have put the field names at the top, to make it easier.
  228.  
  229. LIMITATIONS:  There are many: 1) As of now, it will only read tab delimited fields, though I am working on other formats (such as mailmerge, comma delimited, SYLK, etc.). 2) All the created fields are the same size on screen.  This simplified the coding, and it shouldn't be too hard to go back and adjust them. 
  230.  
  231. CHANGES: Aside from making it more flexible in types of files it can read, it could go faster by locking the screen, so every record doesn't have to get written.  But I like to see what is going on.  You can also customize this by placing the "import" button onto a background you like better -- it is  self contained.
  232.  
  233. Clicking "cancel" in most dialogues will NOT stop the entire operation -- I haven't done all the error trapping yet.  Typing command-period will stop it, though it will leave the source file open.  Type "close file" followed by the file name into the message box to close the file.  I have worked with files of up to 500 records, and it does take some time (about 10 minutes to read 200 or so records into a stack).
  234.  
  235.  
  236. -- part contents for background part 13
  237. ----- text -----
  238. Buttons